# 人工智能1906A裴云鹏
# 2021年1月25日 星期一 上午8:42
# 第三周周考 技能
# 第一大题

def sep(label=''):
    '''
    Utility function to print a separator line.
    :param label: The optional label.
    :return: None
    '''
    print('-' * 16, label, '-' * 16, sep='')


# 1．写一个无参函数say1，打印输出“我在家上网课，我要努力学习！”。调用这个函数。
sep(1)
print('1．写一个无参函数say1，打印输出“我在家上网课，我要努力学习！”。调用这个函数。')


def say1():
    '''无参函数say1，打印输出“我在家上网课，我要努力学习！”'''
    print('我在家上网课，我要努力学习！')


say1()  # 调用

# 2．写一个有参函数say2（ｍ），打印输出ｍ遍“我在家上网课，我要努力学习！”。调用这个函数。
sep('2')
print('2．写一个有参函数say2（ｍ），打印输出ｍ遍“我在家上网课，我要努力学习！”。调用这个函数。')


def say2(m):
    '''有参函数say2（ｍ），打印输出ｍ遍“我在家上网课，我要努力学习！”。'''
    if m < 0:  # 为了健壮性
        m = 0
    for i in range(m):  # 循环m遍
        print('我在家上网课，我要努力学习！')


say2(3)  # 调用

# 3．写一个匿名函数，无参，输出“要学好智能，高薪就业，告慰父母”。调用匿名函数
sep(3)
print('3．写一个匿名函数，无参，输出“要学好智能，高薪就业，告慰父母”。调用匿名函数')
(lambda: print('要学好智能，高薪就业，告慰父母'))()

# 4．写一个匿名函数，有一个参数x，输出“x要学好智能，高薪就业，告慰父母”。调用匿名函数,实现输出：　　　“小明要学好智能，高薪就业，告慰父母”
sep(4)
print('4．写一个匿名函数，有一个参数x，输出“x要学好智能，高薪就业，告慰父母”。调用匿名函数,实现输出：　　　“小明要学好智能，高薪就业，告慰父母”')
(lambda x: print(f'{x}要学好智能，高薪就业，告慰父母'))('小明')

# 5．写一个有参匿名函数，功能是求长方体的体积，用x,y,z分别表示长方体的长宽高。调用这个函数，求出边长为11,12,13的长方体体积
sep(5)
print('5．写一个有参匿名函数，功能是求长方体的体积，用x,y,z分别表示长方体的长宽高。调用这个函数，求出边长为11,12,13的长方体体积')
print(f'边长为11,12,13的长方体体积: {(lambda x, y, z: x * y * z)(11,12,13)}')

# 6．定义一个无参有返的函数，功能实现求长方体体积，函数名为my_volu；调用你写的这个函数，求出边长为21,22,23的长方体体积
sep(6)
print('6．定义一个无参有返的函数，功能实现求长方体体积，函数名为my_volu；调用你写的这个函数，求出边长为21,22,23的长方体体积')


def my_volu():
    '''无参有返的函数，功能实现求长方体体积'''
    print('请输入边长以计算体积：')
    x = float(input('x=? :'))
    y = float(input('y=? :'))
    z = float(input('z=? :'))
    return x * y * z


print(f'您输入的长方体体积是：{my_volu()}')

# 7．定义一个函数idle，判断用户传入的参数（字符串、列表、元组）是否为空，即判断其中的元素个数是否为0.分别调用idle([1,2,3]), idle(()),idle(‘hello’)
sep(7)
print('7．定义一个函数idle，判断用户传入的参数（字符串、列表、元组）是否为空，即判断其中的元素个数是否为0.分别调用idle([1,2,3]), idle(()),idle(‘hello’)')


def idle(x):
    '''判断用户传入的参数（字符串、列表、元组）是否为空'''
    xlen = len(x)
    if 0 == xlen:
        print(x, '为空')
    else:
        print(x, '不为空')


idle([1,2,3])
idle(())
idle('hello')

# 8．写一个对列表“掐头去尾”的函数，例如输入一个列表是[1,2,3,4,5,6,7,8,9,0],输出列表的最终样式是[2,3,4,5,6,7,8,9]
sep(8)
print('8．写一个对列表“掐头去尾”的函数，例如输入一个列表是[1,2,3,4,5,6,7,8,9,0],输出列表的最终样式是[2,3,4,5,6,7,8,9]')


def remove_head_tail(xseq):
    '''对列表“掐头去尾”的函数'''
    xlen = len(xseq)
    if xlen <= 1:
        return []
    else:
        xcpy = xseq.copy()
        xcpy.pop(0)
        xcpy.pop(-1)
        return xcpy


xlist = [1,2,3,4,5,6,7,8,9,0]
xlist2 = remove_head_tail(xlist)
print(f'{xlist} --> {xlist2}')

# 9．定义一个递归函数Fibon，功能是：输出斐波那契数列Leonardoda Fibonacci的前20项的数字
sep(9)
print('9．定义一个递归函数Fibon，功能是：输出斐波那契数列Leonardoda Fibonacci的前20项的数字')


def Fibon(n):
    '''递归函数Fibon，功能是：输出斐波那契数列第n项的数字'''
    if n <= 0:
        return 0
    elif n <= 2:
        return 1
    else:
        return Fibon(n - 1) + Fibon(n - 2)


# 调用：输出斐波那契数列Leonardoda Fibonacci的前20项的数字
for i in range(1, 20 + 1):
    print(f'第{i}项是{Fibon(i)}')

# 10．定义递归函数，实现功能：计算正整数1,2,3,4，5…，100的累加之和
sep(10)
print('10．定义递归函数，实现功能：计算正整数1,2,3,4，5…，100的累加之和')


def recursive_sum(n):
    if n <= 0:
        return 0
    elif n <= 1:
        return 1
    else:
        return n + recursive_sum(n - 1)


# 调用
print(f'正整数1,2,3,4，5…，100的累加之和:{recursive_sum(100)}')

# 11．创建函数，funct
# （1）函数名：funct
# （2）参数：关键字变长参数**kwargs；
# （3）返回值：列表；
# （4）功能介绍：
# ①查看kwargs值和数据类型
# ②先用for循环显示关键字变长参数中所有的键；
# ③再将关键字变长参数中所有的值保存到列表rlist中；最后返回rlist；
# （5）调用funct(name=“刘决心”，age＝20，prov＝“河南”, city＝“南阳”， salary=25K)查看效果
sep(11)
print('11．创建函数，funct')


def funct(**kwargs):
    '''
    关键字变长参数考试函数
    :param kwargs: 关键字变长参数
    :return: 列表
    '''
    # ①查看kwargs值和数据类型
    print('kwargs值:', kwargs.values())
    print('kwargs数据类型:', type(kwargs))
    # ②先用for循环显示关键字变长参数中所有的键；
    print('用for循环显示关键字变长参数中所有的键:')
    for k in kwargs.keys():
        print(k)
    # ③再将关键字变长参数中所有的值保存到列表rlist中；最后返回rlist；
    rlist = []
    for v in kwargs.values():
        rlist.append(v)
    return rlist


print('调用funct(name=“刘决心”，age＝20，prov＝“河南”, city＝“南阳”， salary=25K)查看效果')
print('调用funct的返回值是：', funct(name='刘决心', age=20, prov='河南', city='南阳', salary='25K'))

# 12．定义函数，可变长参数，使其实现功能如下：
# 1）用户不断地输入数字，输入b退出，将输入的所有数字返回
# 2）调用该函数，然后打印出以下内容：总和是多少  有多少个  平均是多少
sep(12)
print('12．定义函数，可变长参数，使其实现功能如下：')
print('1）用户不断地输入数字，输入b退出，将输入的所有数字返回')
print('2）调用该函数，然后打印出以下内容：总和是多少  有多少个  平均是多少')

def xinput(*args):
    '''用户不断地输入数字，输入b退出，将输入的所有数字返回，然后打印出以下内容：总和是多少  有多少个  平均是多少'''
    xlist = []
    while True:
        xin = input('请输入数字，输入b退出: ').strip()
        if 'b' == xin:
            break
        else:
            xlist.append(float(xin))
    xlen = len(xlist)
    if xlen <= 0:
        print('没有数据！')
        return
    xsum = sum(xlist)
    xavg = xsum / xlen
    print(f'总和是{xsum}  有{xlen}个  平均是{xavg}')
    return xlist


xinput()  # 调用
